MFCC
计算梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients)。
\[MFCC_i = f(Input_i)\]
- 输入:
mfcc_params - MFCC 计算相关的配置参数,如采样率、梅尔滤波器数量等。
spec_params - 频谱计算参数,定义了FFT窗口大小、重叠长度等。
mfcc_workspace - 工作空间参数,包括计算所需的中间缓冲区。
spec_workspace - 频谱计算的工作空间,包括FFT的窗口、输入数据等。
core_mask (可选) - 核掩码(仅适用于多核版本)。
- 输出:
output(mfcc_params中) - 计算结果地址,存储MFCC特征。
output_shape(mfcc_params中) - 输出数据的形状,描述MFCC特征的维度。
- 结构体定义:
1 typedef struct { 2 // 输入/输出 3 float* input; // 输入数据地址 4 int* input_shape; // 输入数据形状 5 float* output; // 输出数据地址 6 int* output_shape; // 输出数据形状 7 8 // 配置参数 9 int sample_rate; // 采样率 10 int n_mfcc; // MFCC系数数量 11 int dct_type; // DCT变换类型 12 bool log_mels; // 是否对梅尔频谱取对数 13 float f_min; // 最小频率 14 float f_max; // 最大频率 15 int n_mels; // 梅尔滤波器数量 16 NormType norm; // 归一化类型 17 NormMode norm_M; // 归一化模式 18 MelType mel_scale; // 梅尔尺度类型 19 } MfccParam; 20 21 typedef struct { 22 // 输入 23 float* input; // 输入数据地址 24 int input_len; // 输入数据长度 25 26 // 输出 27 float* output; // 输出数据地址 28 int* output_shape; // 输出数据形状 29 30 // 配置参数 31 int pad; // 填充大小 32 WindowType window_type; // 窗函数类型 33 int n_fft; // FFT点数 34 int hop_length; // 帧移长度 35 int win_length; // 窗长度 36 float power; // 功率值 37 bool normalized; // 是否归一化 38 bool center; // 是否中心化 39 BorderType pad_mode; // 填充模式 40 bool onesided; // 是否单边频谱 41 } SpectrogramParam; 42 43 typedef struct { 44 // 滤波器组计算缓冲区 45 float *all_freqs; // 所有频率点 46 float *m_pts; // 梅尔频率点 47 float *f_pts; // 线性频率点 48 float *fb; // 滤波器组 49 50 // 三角滤波器计算缓冲区 51 float *f_diff; // 频率差值 52 float *slopes; // 斜率 53 float *down_slopes; // 下降斜率 54 float *up_slopes; // 上升斜率 55 56 // DCT变换缓冲区 57 float* dct_mat; // DCT矩阵 58 59 // 中间结果缓冲区 60 float* spectrogram_output; // 频谱图输出 61 float* mel_spectrogram_output; // 梅尔频谱输出 62 } MfccWorkspaceParam; 63 64 typedef struct { 65 float* fft_window; // FFT窗函数缓冲区 66 float* fft_window_later; // 后续FFT窗缓冲区 67 float* input_data_pad; // 填充后的输入数据 68 float* input_data; // 输入数据缓冲区 69 float* input_win; // 加窗输入数据 70 float* exp_complex; // 复数指数缓冲区 71 float* spec_f; // 频谱频率缓冲区 72 float* output_onsided; // 单边输出缓冲区 73 } WorkspaceParam;
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持 fp32
MT7004 支持 fp32, fp16
共享存储版本:
-
void fp_mfcc_s(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace, int core_mask)
-
void hp_mfcc_s(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace, int core_mask)
C调用示例:
1//FT78NE示例 2#include <stdio.h> 3 4int main(int argc, char* argv[]) { 5 float* input_data = (float*)0x81000000; 6 float* output_mfcc = (float*)0x82000000; 7 int input_shape[2] = {1, 4000}; 8 int output_shape[2] = {0, 0, 0}; 9 MfccParam* mfcc_params = (MfccParam*)0x83100000; 10 SpectrogramParam* spec_params = (SpectrogramParam*)0x83200000; 11 MfccWorkspaceParam* mfcc_workspace = (MfccWorkspaceParam*)0x83300000; 12 WorkspaceParam* spec_workspace = (WorkspaceParam*)0x83400000; 13 14 mfcc_params->input = input_data; 15 mfcc_params->input_shape = input_shape; 16 mfcc_params->output = output_mfcc; 17 mfcc_params->output_shape = output_shape; 18 mfcc_params->sample_rate = 800; 19 mfcc_params->n_mfcc = 6; 20 mfcc_params->dct_type = 2; 21 mfcc_params->log_mels = true; 22 mfcc_params->f_min = 0.0f; 23 mfcc_params->f_max = 400.0f; 24 mfcc_params->n_mels = 8; 25 mfcc_params->norm = NORM_SLANEY; 26 mfcc_params->norm_M = NORM_MODE_ORTHO; 27 mfcc_params->mel_scale = MEL_HTK; 28 29 // 结构体 2: SpectrogramParam 30 spec_params->pad = 0; 31 spec_params->window_type = kHann; 32 spec_params->n_fft = 32; 33 spec_params->hop_length = 16; 34 spec_params->win_length = 32; 35 spec_params->power = 2.0f; 36 spec_params->normalized = false; 37 spec_params->center = false; 38 spec_params->pad_mode = kConstant; 39 spec_params->onesided = true; 40 41 int core_mask = 0xff; 42 //为mfcc_workspace和spec_workspace里每个中间缓冲区指针分配地址 43 //... 44 45 fp_mfcc_s(mfcc_params, spec_params, mfcc_workspace, spec_workspace, core_mask); 46 return 0; 47}
私有存储版本:
-
void fp_mfcc_p(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace)
-
void hp_mfcc_p(const MfccParam *mfcc_params, SpectrogramParam *spec_params, MfccWorkspaceParam *mfcc_workspace, WorkspaceParam *spec_workspace)
C调用示例:
1//FT78NE示例 2#include <stdio.h> 3 4int main(int argc, char* argv[]) { 5 MfccParam mfcc_params; 6 SpectrogramParam spec_params; 7 MfccWorkspaceParam mfcc_workspace; 8 WorkspaceParam spec_workspace; 9 10 float* input_data = (float*)0x10810000; 11 float* output_mfcc = (float*)0x10820000; 12 int input_shape[2] = {1, 4000}; 13 int output_shape[2] = {0, 0, 0}; 14 15 mfcc_params.input = input_data; 16 mfcc_params.input_shape = input_shape; 17 mfcc_params.output = output_mfcc; 18 mfcc_params.output_shape = output_shape; 19 mfcc_params.sample_rate = 800; 20 mfcc_params.n_mfcc = 6; 21 mfcc_params.dct_type = 2; 22 mfcc_params.log_mels = true; 23 mfcc_params.f_min = 0.0f; 24 mfcc_params.f_max = 400.0f; 25 mfcc_params.n_mels = 8; 26 mfcc_params.norm = NORM_SLANEY; 27 mfcc_params.norm_M = NORM_MODE_ORTHO; 28 mfcc_params.mel_scale = MEL_HTK; 29 30 // 结构体 2: SpectrogramParam 31 spec_params.pad = 0; 32 spec_params.window_type = kHann; 33 spec_params.n_fft = 32; 34 spec_params.hop_length = 16; 35 spec_params.win_length = 32; 36 spec_params.power = 2.0f; 37 spec_params.normalized = false; 38 spec_params.center = false; 39 spec_params.pad_mode = kConstant; 40 spec_params.onesided = true; 41 42 //为mfcc_workspace和spec_workspace里每个中间缓冲区指针分配地址 43 //... 44 45 fp_mfcc_p(&mfcc_params, &spec_params, &mfcc_workspace, &spec_workspace); 46 return 0; 47}